package com.ara.common.kernel.util;

import android.text.TextUtils;
import android.util.Log;

import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * Created by XieXin on 2018/12/10.
 * 字符串工具类
 */
public class StringUtils {
    private static DecimalFormat decimalFormat = new DecimalFormat("0");
    private static DecimalFormat decimalFormat1 = new DecimalFormat("0.0");
    private static DecimalFormat decimalFormat2 = new DecimalFormat("0.00");
    private static DecimalFormat decimalFormat3 = new DecimalFormat("0.000");
    private static DecimalFormat decimalFormat4 = new DecimalFormat("0.0000");
    private static DecimalFormat decimalCommaFormat = new DecimalFormat("#,###");
    private static DecimalFormat decimalCommaFormat1 = new DecimalFormat("#,###.0");
    private static DecimalFormat decimalCommaFormat2 = new DecimalFormat("#,###.00");
    private static DecimalFormat decimalCommaFormat3 = new DecimalFormat("#,###.000");
    private static DecimalFormat decimalCommaFormat4 = new DecimalFormat("#,###.0000");

    private StringUtils() {
    }

    /**
     * 保留小数
     *
     * @param str     字符串
     * @param decimal 保留几位小数，最大保留4位小数
     * @return 返回String
     */
    public static String retainDecimal(String str, int decimal) {
        String retainDecimal = str;
        if (TextUtils.isEmpty(str) || decimal >= 4 || decimal < 0) {
            return retainDecimal;
        }
        BigDecimal bigDecimal = new BigDecimal(str);
        switch (decimal) {
            case 0://保留0位小数
                retainDecimal = decimalFormat.format(bigDecimal.doubleValue());
                break;
            case 1://保留1位小数
                retainDecimal = decimalFormat1.format(bigDecimal.doubleValue());
                break;
            case 2://保留2位小数
                retainDecimal = decimalFormat2.format(bigDecimal.doubleValue());
                break;
            case 3://保留3位小数
                retainDecimal = decimalFormat3.format(bigDecimal.doubleValue());
                break;
            case 4://保留4位小数
                retainDecimal = decimalFormat4.format(bigDecimal.doubleValue());
                break;
        }
        Log.i("StringUtils", "String retainDecimal = " + retainDecimal);
        return retainDecimal;
    }

    /**
     * 保留小数
     *
     * @param d       double
     * @param decimal 保留几位小数，最大保留4位小数
     * @return 返回String
     */
    public static String retainDecimal(double d, int decimal) {
        String retainDecimal = d + "";
        if (decimal >= 4 || decimal < 0) {
            return retainDecimal;
        }
        switch (decimal) {
            case 0://保留0位小数
                retainDecimal = decimalFormat.format(d);
                break;
            case 1://保留1位小数
                retainDecimal = decimalFormat1.format(d);
                break;
            case 2://保留2位小数
                retainDecimal = decimalFormat2.format(d);
                break;
            case 3://保留3位小数
                retainDecimal = decimalFormat3.format(d);
                break;
            case 4://保留4位小数
                retainDecimal = decimalFormat4.format(d);
                break;
        }
        Log.i("StringUtils", "double retainDecimal = " + retainDecimal);
        return retainDecimal;
    }

    /**
     * 保留小数
     *
     * @param f       float
     * @param decimal 保留几位小数，最大保留4位小数
     * @return 返回String
     */
    public static String retainDecimal(float f, int decimal) {
        String retainDecimal = f + "";
        if (decimal >= 4 || decimal < 0) {
            return retainDecimal;
        }
        switch (decimal) {
            case 0://保留0位小数
                retainDecimal = decimalFormat.format(f);
                break;
            case 1://保留1位小数
                retainDecimal = decimalFormat1.format(f);
                break;
            case 2://保留2位小数
                retainDecimal = decimalFormat2.format(f);
                break;
            case 3://保留3位小数
                retainDecimal = decimalFormat3.format(f);
                break;
            case 4://保留4位小数
                retainDecimal = decimalFormat4.format(f);
                break;
        }
        Log.i("StringUtils", "float retainDecimal = " + retainDecimal);
        return retainDecimal;
    }

    /**
     * 保留小数
     *
     * @param i       int
     * @param decimal 保留几位小数，最大保留4位小数
     * @return 返回String
     */
    public static String retainDecimal(int i, int decimal) {
        String retainDecimal = i + "";
        if (decimal >= 4 || decimal < 0) {
            return retainDecimal;
        }
        switch (decimal) {
            case 0://保留0位小数
                retainDecimal = decimalFormat.format(i);
                break;
            case 1://保留1位小数
                retainDecimal = decimalFormat1.format(i);
                break;
            case 2://保留2位小数
                retainDecimal = decimalFormat2.format(i);
                break;
            case 3://保留3位小数
                retainDecimal = decimalFormat3.format(i);
                break;
            case 4://保留4位小数
                retainDecimal = decimalFormat4.format(i);
                break;
        }
        Log.i("StringUtils", "int retainDecimal = " + retainDecimal);
        return retainDecimal;
    }

    /**
     * 保留小数并每个4位数添加逗号
     *
     * @param d       double
     * @param decimal 保留几位小数，最大保留4位小数
     * @return 返回String
     */
    public static String retainDecimalByComma(double d, int decimal) {
        String retainDecimal = "";
        if (decimal >= 4 || decimal < 0) {
            return retainDecimal;
        }
        if (d < 1) {
            return retainDecimal(d, decimal);
        }
        switch (decimal) {
            case 0://保留0位小数
                retainDecimal = decimalCommaFormat.format(d);
                break;
            case 1://保留1位小数
                retainDecimal = decimalCommaFormat1.format(d);
                break;
            case 2://保留2位小数
                retainDecimal = decimalCommaFormat2.format(d);
                break;
            case 3://保留3位小数
                retainDecimal = decimalCommaFormat3.format(d);
                break;
            case 4://保留4位小数
                retainDecimal = decimalCommaFormat4.format(d);
                break;
        }
        Log.i("StringUtils", "int retainDecimal = " + retainDecimal);
        return retainDecimal;
    }

    /**
     * 是否包含Emoji表情
     *
     * @param str
     * @return
     */
    public static boolean containsEmoji(String str) {
        int len = str.length();
        for (int i = 0; i < len; i++) {
            if (isEmojiCharacter(str.charAt(i))) {
                return true;
            }
        }
        return false;
    }

    /**
     * 是否Emoji字符
     *
     * @param codePoint
     * @return
     */
    public static boolean isEmojiCharacter(char codePoint) {
        return !((codePoint == 0x0) ||
                (codePoint == 0x9) ||
                (codePoint == 0xA) ||
                (codePoint == 0xD) ||
                ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) ||
                ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) ||
                ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF)));
    }
}
